home *** CD-ROM | disk | FTP | other *** search
- {
- I have been exploring a faster way to read lines from text
- files. This one seems to be 30% faster than readln even with
- a full settextbuffer of $FFFF. However, it only works for
- files smaller than 64K ($FFF1) and all lines, including the
- last one, must end in the CR/LF word (readln recognizes the
- EOF (01Ah) char also as an end of line). Please repost any
- improvements. }
-
- program readtext;
-
- Uses CRT;
-
- const
- maxsize = $FFF0;
-
- type
- barr = array[0..maxsize] of byte;
- ptrbarr = ^barr;
-
- var
- f : file;
- s : string;
- p : longint;
- fsiz : longint;
- fbuf : ptrbarr;
-
- function pos13(pnt:pointer): word; assembler;
- asm
- les di,[pnt] {load pointer in es:di}
- mov cx,$00FF {load maximum size to scan in cx}
- mov bx,cx {save maximum size to scan in bx}
- mov al,$0D {load in al byte to match = 0Dh}
- cld {increment di}
- repne scasb {search loop}
- je @found {jump if found}
- mov ax,0 {if not found report result = 0}
- jmp @fin {goto end}
- @found: {if found...}
- sub bx,cx {get position matched}
- mov ax,bx {report result = position matched}
- @fin:
- end;
-
- procedure readx(fbuf:ptrbarr;var s:string;var p:longint);
- var
- q : word;
- b : ptrbarr;
- begin
- b:= addr(fbuf^[p]); {point to first byte in remaining block}
- q:= pos13(b); {get position of first $0D occurence}
- move(b^,s[1],pred(q)); {transfer preceeding bytes to string}
- s[0]:= char(pred(q)); {assign size byte to Pascal string}
- inc(p,succ(q)); {adjust pointer skipping 1 byte ($0A)}
- end;
-
- begin
- ClrScr;
- if paramcount = 0 then
- BEGIN
- writeLn( 'Enter FILENAME on commandline');
- halt;
- END;
- assign(f,paramstr(1));
- reset(f,1);
- fsiz:= filesize(f);
- if fsiz > maxsize then halt;
- getmem(fbuf,fsiz);
- blockread(f,fbuf^,fsiz);
- close(f);
- p := 0; {initialize pointer to position in fbuf^}
- while p < fsiz do begin
- readx(fbuf,s,p);
- writeln(s);
- end;
- dispose(fbuf);
- end.
-